import { useParams } from 'common'
import { keyBy } from 'lodash'
import { useCallback, useMemo } from 'react'
import { toast } from 'sonner'
import { ENV_VAR_RAW_KEYS } from '@/components/interfaces/Integrations/Vercel/Integrations-Vercel.constants'
import { isVercelUrl } from '@/components/interfaces/Integrations/Vercel/VercelIntegration.utils'
import ProjectLinker, {
ForeignProject,
} from '@/components/interfaces/Integrations/VercelGithub/ProjectLinker'
import { Markdown } from '@/components/interfaces/Markdown'
import VercelIntegrationWindowLayout from '@/components/layouts/IntegrationsLayout/VercelIntegrationWindowLayout'
import { ScaffoldColumn, ScaffoldContainer } from '@/components/layouts/Scaffold'
import { vercelIcon } from '@/components/to-be-cleaned/ListIcons'
import { useOrgIntegrationsQuery } from '@/data/integrations/integrations-query-org-only'
import { useIntegrationVercelConnectionsCreateMutation } from '@/data/integrations/integrations-vercel-connections-create-mutation'
import { useVercelProjectsQuery } from '@/data/integrations/integrations-vercel-projects-query'
import { useOrganizationsQuery } from '@/data/organizations/organizations-query'
import { BASE_PATH } from '@/lib/constants'
import { EMPTY_ARR } from '@/lib/void'
import { useIntegrationInstallationSnapshot } from '@/state/integration-installation'
import type { NextPageWithLayout, Organization } from '@/types'
const VERCEL_ICON = (
)
const VercelIntegration: NextPageWithLayout = () => {
const { slug, configurationId, next } = useParams()
/**
* Fetch the list of organization based integration installations for Vercel.
*
* Array of integrations installed on all
*/
const { data: integrationData } = useOrgIntegrationsQuery({ orgSlug: slug })
const { data } = useOrganizationsQuery({ enabled: slug !== undefined })
const organization = data?.find((organization: Organization) => organization.slug === slug)
const integration = integrationData?.find(
(x) =>
x.metadata !== undefined &&
'configuration_id' in x.metadata &&
x.metadata?.configuration_id === configurationId
)
const { data: vercelProjectsData, isPending: isLoadingVercelProjectsData } =
useVercelProjectsQuery(
{
organization_integration_id: integration?.id,
},
{ enabled: integration?.id !== undefined }
)
const vercelProjects = useMemo(() => vercelProjectsData ?? EMPTY_ARR, [vercelProjectsData])
const vercelProjectsById = useMemo(() => keyBy(vercelProjects, 'id'), [vercelProjects])
const getForeignProjectIcon = useCallback(
(_project: ForeignProject) => {
const project = vercelProjectsById[_project.id]
return !project?.framework ? (
vercelIcon
) : (
)
},
[vercelProjectsById]
)
const snapshot = useIntegrationInstallationSnapshot()
const { mutate: createConnections, isPending: isCreatingConnection } =
useIntegrationVercelConnectionsCreateMutation({
onSuccess() {
if (next && isVercelUrl(next)) {
snapshot.setLoading(false)
window.location.href = next
}
},
onMutate() {
snapshot.setLoading(true)
},
onError(error) {
snapshot.setLoading(false)
toast.error(`Creating connection failed: ${error.message}`)
},
})
const onCreateConnections = useCallback(
(vars: any) => {
createConnections({
...vars,
connection: {
...vars.connection,
metadata: {
...vars.connection.metadata,
brivenConfig: {
projectEnvVars: {
write: true,
},
},
},
},
})
},
[createConnections]
)
return (
<>
Create your first Project Connection
{
if (next && isVercelUrl(next)) {
window.location.href = next
}
}}
loadingForeignProjects={isLoadingVercelProjectsData}
mode="Vercel"
/>
{
return `\n - \`${x}\``
})}
`}
/>
>
)
}
VercelIntegration.getLayout = (page) => (
{page}
)
export default VercelIntegration